package com.qtt.app.controller;

import com.qtt.app.common.ApiResponse;
import com.qtt.app.entity.RequestData.IsConcernCourse;
import com.qtt.app.entity.ReturnInfo.ReturnConcern;
import com.qtt.app.service.AppConcernService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import com.qtt.app.entity.RequestData.*;

import java.util.List;

@Api(tags = "关注的机构、讲师、课程", description = "ConcernController")   //tags是api名字，description是简介，value:已废用
@RestController
@RequestMapping("/Concern")
public class AppConcernController {
    @Autowired
    AppConcernService appConcernService;

    @ApiOperation(value = "查看某人关注的机构列表或老师列表或课程列表", notes = "要非常注意一点，返回的id都是String类型，老师和机构的id都是int型，分别是teacherId和institutionId；需要注意的是，课程id为String型，且它在表中名为generalId而不是courseId")  //value是Get /Msg/list旁边的那个api简介；notes是点开的介绍，可用于详细说明api作用
    @GetMapping("/concernList")
    public ApiResponse<List<ReturnConcern>> getMyConcern(@ApiParam(value="用户id",required = true) @RequestParam(value="userId",required=true) Long userId,
                                                         @ApiParam(value="flag,表示关注的是1机构、2老师、3课程",required = true) @RequestParam(value="flag",required=true) Integer flag
                                                         ) {

        int concernState = 1;//1为已关注，2为未关注
        List<ReturnConcern> entities = appConcernService.getMyConcern(userId, concernState, flag);
        String message = null;
        if (entities.size() ==0) {//注意列表如果返回的是空，需要这么判断，空列表为[]
            if (flag==1) {message="查询失败，您还没有任何关注的机构";}
            if (flag==2) {message="查询失败，您还没有任何关注的讲师";}
            if (flag==3) {message="查询失败，您还没有任何关注的课程";}
            return ApiResponse.<List<ReturnConcern>>builder().code(400).message(message).data(entities).build();
        }
        else {
            return ApiResponse.<List<ReturnConcern>>builder().code(200).message("查看成功").data(entities).build();

        }
    }

    @ApiOperation(value = "查看用户是否已经关注了某个机构、讲师或者课程", notes = "要非常注意一点，老师和机构的id都是int型，分别是teacherId和institutionId；需要注意的是，课程id为String型，且它在表中名为generalId而不是courseId。传入的参数有误，统一返回false，并不区分细致的错误类型")  //value是Get /Msg/list旁边的那个api简介；notes是点开的介绍，可用于详细说明api作用
    @GetMapping("/isMyConcern")
//    @GetMapping("/isMyConcern/{userId}/{concernId}/{flag}")
//    public ApiResponse<Boolean> isMyConcern(@ApiParam(value="用户id",required = true) @PathVariable(value="userId",required=true) Long userId,
//                                            @ApiParam(value="flag,表示传入的concernId为1是机构、2讲师、3课程",required = true) @PathVariable(value="flag",required=true) Integer flag,
//                                            @ApiParam(value="concernId,传入机构id或讲师id或课程id，统一是String型",required = true) @PathVariable(value="concernId",required=true) String concernId) {
    public ApiResponse<Boolean> isMyConcern(@ApiParam(value="用户id",required = true) @RequestParam(value="userId",required=true) Long userId,
                                                         @ApiParam(value="flag,表示传入的concernId为1是机构、2讲师、3课程",required = true) @RequestParam(value="flag",required=true) Integer flag,
                                                        @ApiParam(value="concernId,传入机构id或讲师id或课程id，统一是String型",required = true) @RequestParam(value="concernId",required=true) String concernId) {

        if(flag!=3 && flag!=1 &&flag!=2){
            return ApiResponse.<Boolean>builder().code(400).message("传入的flag错误").data(false).build();
        }
        Boolean isConcernFlag = appConcernService.isMyConcern(userId,flag,concernId);
        if(isConcernFlag == true){
            return ApiResponse.<Boolean>builder().code(200).message("你已经关注").data(true).build();
        }
        else {
            return ApiResponse.<Boolean>builder().code(400).message("你还未关注").data(false).build();
        }



    }

//    //这个写的有些问题，关注有两种情况，一是用户从来没关注过该机构，需要新建一条记录；二是用户曾经关注后但后来取消了。取消关注只有一种情况，是表中一定就存在这条记录，那要取消关注。
//    //表设计的约束，在一种flag的情况下，每个userId在对应的concernId不能重复。
//    //所以不应该以主键来进行操作，而应该以flag+concernId结合，这两个字段能找到唯一的一条记录。来对那条记录进行修改。
//    @ApiOperation(value = "关注或者取消关注一个机构", notes = "")  //value是Get /Msg/list旁边的那个api简介；notes是点开的介绍，可用于详细说明api作用
//    @PostMapping("/isConcernInst")
//    public ApiResponse<String> isConcernInstitution(@ApiParam(value="用户id",required = true) @RequestParam(value="userId",required=true) Long userId,
//                                                    @ApiParam(value="机构id",required = true) @RequestParam(value="institutionId",required=true) Integer institutionId,
//                                                    @ApiParam(value="关注状态,1为关注，2为取消关注",required = true) @RequestParam(value="concernState",required=true) Integer concernState
////                                                    @ApiParam(value="flag,表示关注的是1机构、2老师、3课程",required = true) @RequestParam(value="flag",required=true) Integer flag
//    ) {
//        int flag=1;
//        int b = appConcernService.isConcernInstitution(userId,institutionId, concernState,flag);
//        String message =null;
//        if (concernState!=1 && concernState!=2){return ApiResponse.<String>builder().code(400).message("请检查传入的concernState是否合理").data("fail").build();}
//        if (b == 201){
//            message ="已关注该机构";
//            return ApiResponse.<String>builder().code(200).message(message).data("success").build();
//        }
//        else if(b==202){
//            message = "已取消关注该机构";
//            return ApiResponse.<String>builder().code(200).message(message).data("success").build();
//        }
//        else if(b==402){
//            return ApiResponse.<String>builder().code(400).message("请检查传入的机构id是否正确").data("fail").build();
//        }
//        else if(b==401){
//            return ApiResponse.<String>builder().code(400).message("请检查传入的用户id是否正确").data("fail").build();
//        }
//        else{
//            return ApiResponse.<String>builder().code(400).message("操作失败").data("fail").build();
//        }
//    }

//    //这个写的有些问题，关注有两种情况，一是用户从来没关注过该机构，需要新建一条记录；二是用户曾经关注后但后来取消了。取消关注只有一种情况，是表中一定就存在这条记录，那要取消关注。
//    //表设计的约束，在一种flag的情况下，每个userId在对应的concernId不能重复。
//    //所以不应该以主键来进行操作，而应该以flag+concernId结合，这两个字段能找到唯一的一条记录。来对那条记录进行修改。
//    @ApiOperation(value = "关注或者取消关注一个老师", notes = "")  //value是Get /Msg/list旁边的那个api简介；notes是点开的介绍，可用于详细说明api作用
//    @PostMapping("/isConcernTeacher")
//    public ApiResponse<String> isConcernTeacher(@ApiParam(value="用户id",required = true) @RequestParam(value="userId",required=true) Long userId,
//                                                    @ApiParam(value="老师id",required = true) @RequestParam(value="teacherId",required=true) Integer teacherId,
//                                                    @ApiParam(value="关注状态,1为关注，2为取消关注",required = true) @RequestParam(value="concernstate",required=true) Integer concernState
//    ) {
//        int flag=2;
//        int b = appConcernService.isConcernTeacher(userId,teacherId, concernState,flag);
//        String message =null;
//        if (concernState!=1 && concernState!=2){return ApiResponse.<String>builder().code(400).message("请检查传入的concernState是否合理").data("fail").build();}
//        if (b == 201){
//            message ="已关注该老师";
//            return ApiResponse.<String>builder().code(200).message(message).data("success").build();
//        }
//        else if(b==202){
//            message = "已取消关注该老师";
//            return ApiResponse.<String>builder().code(200).message(message).data("success").build();
//        }
//        else if(b==402){
//            return ApiResponse.<String>builder().code(400).message("请检查传入的老师id是否正确").data("fail").build();
//        }
//        else if(b==401){
//            return ApiResponse.<String>builder().code(400).message("请检查传入的用户id是否正确").data("fail").build();
//        }
//        else{
//            return ApiResponse.<String>builder().code(400).message("操作失败").data("fail").build();
//        }
//    }

//    //这个写的有些问题，关注有两种情况，一是用户从来没关注过该机构，需要新建一条记录；二是用户曾经关注后但后来取消了。取消关注只有一种情况，是表中一定就存在这条记录，那要取消关注。
//    //表设计的约束，在一种flag的情况下，每个userId在对应的concernId不能重复。
//    //所以不应该以主键来进行操作，而应该以flag+concernId结合，这两个字段能找到唯一的一条记录。来对那条记录进行修改。
//    @ApiOperation(value = "关注或者取消关注一门课程", notes = "")  //value是Get /Msg/list旁边的那个api简介；notes是点开的介绍，可用于详细说明api作用
//    @PostMapping("/isConcernCourse")
//    public ApiResponse<String> isConcernCourse(@ApiParam(value="用户id",required = true) @RequestParam(value="userId",required=true) Long userId,
//                                                @ApiParam(value="课程id，注意是String，还有用的是generalId",required = true) @RequestParam(value="generalCourseId",required=true) String generalCourseId,
//                                                @ApiParam(value="关注状态,1为关注，2为取消关注",required = true) @RequestParam(value="concernstate",required=true) Integer concernState
//    ) {
//        int flag=3;
//        int b = appConcernService.isConcernCourse(userId,generalCourseId, concernState,flag);
//        String message =null;
//        if (concernState!=1 && concernState!=2){return ApiResponse.<String>builder().code(400).message("请检查传入的concernState是否合理").data("fail").build();}
//        if (b == 201){
//            message ="已关注该课程";
//            return ApiResponse.<String>builder().code(200).message(message).data("success").build();
//        }
//        else if(b==202){
//            message = "已取消关注该课程";
//            return ApiResponse.<String>builder().code(200).message(message).data("success").build();
//        }
//        else if(b==402){
//            return ApiResponse.<String>builder().code(400).message("请检查传入的课程id是否正确").data("fail").build();
//        }
//        else if(b==401){
//            return ApiResponse.<String>builder().code(400).message("请检查传入的用户id是否正确").data("fail").build();
//        }
//        else{
//            return ApiResponse.<String>builder().code(400).message("操作失败").data("fail").build();
//        }
//    }


    //重写的
    //这个写的有些问题，关注有两种情况，一是用户从来没关注过该机构，需要新建一条记录；二是用户曾经关注后但后来取消了。取消关注只有一种情况，是表中一定就存在这条记录，那要取消关注。
    //表设计的约束，在一种flag的情况下，每个userId在对应的concernId不能重复。
    //所以不应该以主键来进行操作，而应该以flag+concernId结合，这两个字段能找到唯一的一条记录。来对那条记录进行修改。
    @ApiOperation(value = "关注或者取消关注一门课程", notes = "")  //value是Get /Msg/list旁边的那个api简介；notes是点开的介绍，可用于详细说明api作用
    @PostMapping("/isConcernCourse")
    public ApiResponse<String> isConcernCourse(@ApiParam(value="请求参数解释 关注状态：1为关注，2为取消关注；用户id(Long)；课程id（String,且注意是generalId）",required = true) @RequestBody(required=true) IsConcernCourse requestData) {
        int flag=3;
        Long userId = requestData.getUserId();
        String generalCourseId = requestData.getGeneralCourseId();
        Integer concernState = requestData.getConcernState();
        int b = appConcernService.isConcernCourse(userId,generalCourseId, concernState,flag);
        String message =null;
        if (concernState!=1 && concernState!=2){return ApiResponse.<String>builder().code(400).message("请检查传入的concernState是否合理").data("fail").build();}
        if (b == 201){
            message ="已关注该课程";
            return ApiResponse.<String>builder().code(200).message(message).data("success").build();
        }
        else if(b==202){
            message = "已取消关注该课程";
            return ApiResponse.<String>builder().code(200).message(message).data("success").build();
        }
        else if(b==402){
            return ApiResponse.<String>builder().code(400).message("请检查传入的课程id是否正确").data("fail").build();
        }
        else if(b==401){
            return ApiResponse.<String>builder().code(400).message("请检查传入的用户id是否正确").data("fail").build();
        }
        else if(b==403){
            return ApiResponse.<String>builder().code(400).message("你还未关注该课程，所以无法进行取消关注的操作").data("fail").build();
        }
        else{
            return ApiResponse.<String>builder().code(400).message("操作失败").data("fail").build();
        }
    }

    //这个写的有些问题，关注有两种情况，一是用户从来没关注过该机构，需要新建一条记录；二是用户曾经关注后但后来取消了。取消关注只有一种情况，是表中一定就存在这条记录，那要取消关注。
    //表设计的约束，在一种flag的情况下，每个userId在对应的concernId不能重复。
    //所以不应该以主键来进行操作，而应该以flag+concernId结合，这两个字段能找到唯一的一条记录。来对那条记录进行修改。
    @ApiOperation(value = "关注或者取消关注一个机构", notes = "")  //value是Get /Msg/list旁边的那个api简介；notes是点开的介绍，可用于详细说明api作用
    @PostMapping("/isConcernInst")
    public ApiResponse<String> isConcernInstitution(@ApiParam(value="请求参数解释 关注状态：1为关注，2为取消关注；用户id(Long)；机构id(Integer)",required = true) @RequestBody(required=true) IsConcernInstitution requestData) {
        int flag=1;
        Long userId = requestData.getUserId();
        Integer institutionId = requestData.getInstitutionId();
        Integer concernState = requestData.getConcernState();
        int b = appConcernService.isConcernInstitution(userId,institutionId, concernState,flag);
        String message =null;
        if (concernState!=1 && concernState!=2){return ApiResponse.<String>builder().code(400).message("请检查传入的concernState是否合理").data("fail").build();}
        if (b == 201){
            message ="已关注该机构";
            return ApiResponse.<String>builder().code(200).message(message).data("success").build();
        }
        else if(b==202){
            message = "已取消关注该机构";
            return ApiResponse.<String>builder().code(200).message(message).data("success").build();
        }
        else if(b==402){
            return ApiResponse.<String>builder().code(400).message("请检查传入的机构id是否正确").data("fail").build();
        }
        else if(b==401){
            return ApiResponse.<String>builder().code(400).message("请检查传入的用户id是否正确").data("fail").build();
        }
        else if(b==403){
            return ApiResponse.<String>builder().code(400).message("你还未关注该机构，所以无法进行取消关注的操作").data("fail").build();
        }
        else{
            return ApiResponse.<String>builder().code(400).message("操作失败").data("fail").build();
        }
    }


    //这个写的有些问题，关注有两种情况，一是用户从来没关注过该机构，需要新建一条记录；二是用户曾经关注后但后来取消了。取消关注只有一种情况，是表中一定就存在这条记录，那要取消关注。
    //表设计的约束，在一种flag的情况下，每个userId在对应的concernId不能重复。
    //所以不应该以主键来进行操作，而应该以flag+concernId结合，这两个字段能找到唯一的一条记录。来对那条记录进行修改。
    @ApiOperation(value = "关注或者取消关注一个讲师", notes = "")  //value是Get /Msg/list旁边的那个api简介；notes是点开的介绍，可用于详细说明api作用
    @PostMapping("/isConcernTeacher")
    public ApiResponse<String> isConcernTeacher(@ApiParam(value="请求参数解释 关注状态：1为关注，2为取消关注；用户id(Long)；讲师id(Integer)",required = true) @RequestBody(required=true) IsConcernTeacher requestData
    ) {
        int flag=2;
        Long userId = requestData.getUserId();
        Integer teacherId= requestData.getTeacherId();
        Integer concernState = requestData.getConcernState();
        int b = appConcernService.isConcernTeacher(userId,teacherId, concernState,flag);
        String message =null;
        if (concernState!=1 && concernState!=2){return ApiResponse.<String>builder().code(400).message("请检查传入的concernState是否合理").data("fail").build();}
        if (b == 201){
            message ="已关注该老师";
            return ApiResponse.<String>builder().code(200).message(message).data("success").build();
        }
        else if(b==202){
            message = "已取消关注该老师";
            return ApiResponse.<String>builder().code(200).message(message).data("success").build();
        }
        else if(b==402){
            return ApiResponse.<String>builder().code(400).message("请检查传入的老师id是否正确").data("fail").build();
        }
        else if(b==401){
            return ApiResponse.<String>builder().code(400).message("请检查传入的用户id是否正确").data("fail").build();
        }
        else if(b==403){
            return ApiResponse.<String>builder().code(400).message("你还未关注该讲师，所以无法进行取消关注的操作").data("fail").build();
        }
        else{
            return ApiResponse.<String>builder().code(400).message("操作失败").data("fail").build();
        }
    }

}